﻿/************************************************************************

   Extended Silverlight Toolkit

   Copyright (C) 2010-2012 Xceed Software Inc.

   This program is provided to you under the terms of the Microsoft Public
   License (Ms-PL) as published at http://extendedsilverlight.codeplex.com/license

   Please purchase a commercial version of this toolkit if you are using
   it in a commercial product. The commercial versions support the project,
   and also include more features for each control, priority support,
   source code, updates, removed watermark, and a proprietary license.

   Visit http://xceed.com and follow @datagrid on Twitter.

  **********************************************************************/

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;

namespace Xceed.Silverlight.DataGrid.Converters
{
  public class StringToTypeConverter : TypeConverter
  {
    public override bool CanConvertFrom( ITypeDescriptorContext context, Type sourceType )
    {
      if( sourceType == null )
        return false;

      if( sourceType == typeof( String ) )
        return true;

      return false;
    }

    public override bool CanConvertTo( ITypeDescriptorContext context, Type destinationType )
    {
      return this.CanConvertFrom( context, destinationType );
    }

    public override object ConvertFrom( ITypeDescriptorContext context, CultureInfo culture, object value )
    {
      if( value == null )
        return value;

      string stringValue = value as string;

      if( stringValue == null )
        return null;

      if( value is string
        && string.IsNullOrWhiteSpace( value as string ) )
        return null;

      //let the method throw out. If the type cannot be parsed 
      Type retval = Type.GetType( stringValue );

      if( retval == null )
        throw new ArgumentException( "value cannot be parsed into a Type. Make sure it is correct or respects the AssemblyQualifiedName if the type is not within the mscorlib assembly.", "value" );

      return retval;
    }

    public override object ConvertTo( ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType )
    {
      if( value == null )
        return null;

      Type type = value as Type;

      if( type == null )
        return null;

      return type.AssemblyQualifiedName;
    }
  }
}
